package class6;

/**
 * 判断两个字符串是否互为变形词
 * 题目：
 * 给定两个字符串 str1 和 str2, 如果 str1 和 str2 出现的字符种类和出现次数一样，那么 str1 和 str2 互为变形词
 * 例如：
 * str1 = "123" str2 = "213" true
 * str1 = "1234" str2 = "321" false
 */
public class Code01_isDeformation {

    public static void main(String[] args) {
        String str1 = "123";
        String str2 = "232";
        boolean deformation = isDeformation(str1, str2);
        System.out.println("deformation = " + deformation);
    }

    public static boolean isDeformation(String str1, String str2) {
        // 当字符串长度不一致时，直接返回false
        if (str1 == null || str2 == null || str1.length() != str2.length()) {
            return false;
        }
        char[] chars1 = str1.toCharArray();
        char[] chars2 = str2.toCharArray();
        int[] maps = new int[256];
        // 先存储 str1 中每个字符的出现次数
        for (int i = 0; i < chars1.length; i++) {
            maps[chars1[i]]++;
        }
        // 再遍历2，进行--操作，当--操作前，这个字符串次数已经是0，则返回false,因此此时 str2 中比str1中多出现了一次
        for (int i = 0; i < chars2.length; i++) {
            // maps[chars2[i]]-- == 0 这行的逻辑是：我们首先检查 chars2[i] 在 str1 中的出现次数，检查的结果是 maps[chars2[i]] 当前的值。如果它是 0，表示字符已经用尽，再次遇到就会返回 false。
            if (maps[chars2[i]]-- == 0) {
                return false;
            }
        }
        return true;
    }
}
